水無瀬の部屋 > Programming > sample > cur2cpp > loadcur.cpp |
---|
1: //*********************************************************
2: // プロジェクト: cur2cpp
3: // ファイル名: loadcur.cpp
4: //*********************************************************
5: #include "loadcur.h"
6: #include <filefmt/curfile.h>
7: #include <filefmt/bmpfile.h>
8:
9:
10: //---------------------------------------------------------
11: // マクロ の 定義
12: //---------------------------------------------------------
13: #define DBG_ALLOCNAME "LoadMonochromeCursorFileData"
14: #define CALC_MASK_SIZE( cih ) ((cih).width * (cih).height / CHAR_BIT)
15:
16:
17: //---------------------------------------------------------
18: // ファイルスコープ関数 の 宣言
19: //---------------------------------------------------------
20: static bool IsValidMonochromeCursorFileData( const MONOCHROMECURSORFILEDATA_t *cursor );
21:
22:
23: //*********************************************************
24: // ReleaseMonochromeCursorFileData
25: //*********************************************************
26: bool
27: ReleaseMonochromeCursorFileData
28: (
29: MONOCHROMECURSORFILEDATA_t *cursor
30: )
31: {
32: // パラメタの仮定
33: ASSERT( IsValidMonochromeCursorFileData( cursor ) );
34:
35: DBG_UNLOCK_ALLOCED_MEMORY( cursor, DBG_ALLOCNAME ); // [DBG]
36: free( cursor );
37:
38: return true;
39: }//ReleaseMonochromeCursorFileData
40:
41: //*********************************************************
42: // LoadMonochromeCursorFileData
43: //*********************************************************
44: MONOCHROMECURSORFILEDATA_t * // 読み込んだカーソル
45: LoadMonochromeCursorFileData
46: (
47: FILE *fp
48: )
49: {
50: // パラメタの仮定
51: ASSERT( IsValidFilePtr( fp ) );
52:
53: // ファイルヘッダを読み込む
54: CURSORFILEHEAD cfh;
55: if ( !ReadCursorFileHeader( fp, &cfh ) )
56: {
57: return null;
58: }
59: unless ( (0 == cfh.unknown)
60: && (2 == cfh.type)
61: && (1 == cfh.num) )
62: {
63: return null;
64: }
65:
66: // カーソル情報ヘッダを読み込む
67: CURSORINFOHEAD cih;
68: if ( !ReadCursorInfoHeader( fp, &cih ) )
69: {
70: return null;
71: }
72: unless ( (0 == cih.color)
73: && (0 == cih.unknown) )
74: {
75: return null;
76: }
77:
78: // ビットパターンヘッダを読み込む
79: BITMAPINFOHEADER bih;
80: if ( !ReadBitmapInfoHeader( fp, &bih ) )
81: {
82: return null;
83: }
84: unless ( (sizeof(BITMAPINFOHEADER) == bih.biSize)
85: && ( 1 == bih.biPlanes)
86: && ( 1 == bih.biBitCount)
87: && ( 0 == bih.biCompression) )
88: {
89: return null;
90: }
91:
92: // 不明(おそらくパレット)を読み込む
93: DWORD buffer[ 2 ];
94: if ( 2 != fread( buffer, sizeof( *buffer ), 2, fp ) )
95: {
96: return null;
97: }
98:
99: //
100: const size_t size = CALC_MASK_SIZE( cih );
101: MONOCHROMECURSORFILEDATA_t *cursor = (MONOCHROMECURSORFILEDATA_t *)malloc( sizeof( *cursor ) + (2 * size) );
102: if ( !cursor )
103: return null;
104:
105: //
106: cursor->cfh = cfh;
107: cursor->cih = cih;
108: cursor->bih = bih;
109:
110: // XOR ビットパターンを読み込む
111: {
112: BYTE *buf = static_cast<BYTE *>( static_cast<void *>(cursor) ) + sizeof( *cursor );
113: if ( size != fread( buf, 1, size, fp ) )
114: {
115: free( cursor );
116: return null;
117: }
118: cursor->maskXOR = buf;
119: }
120:
121: // AND ビットパターンを読み込む
122: {
123: BYTE *buf = static_cast<BYTE *>( static_cast<void *>(cursor) ) + sizeof( *cursor ) + size;
124: if ( size != fread( buf, 1, size, fp ) )
125: {
126: free( cursor );
127: return null;
128: }
129: cursor->maskAND = buf;
130: }
131:
132: //
133: ASSERT( IsValidMonochromeCursorFileData( cursor ) );
134:
135: //
136: DBG_LOCK_ALLOCED_MEMORY( cursor, DBG_ALLOCNAME ); // [DBG]
137: return cursor;
138: }//LoadMonochromeCursorFileData
139:
140:
141: //******************************************************************************************************************
142: //
143: //******************************************************************************************************************
144: //*********************************************************
145: // IsValidMonochromeCursorFileData
146: //*********************************************************
147: static
148: bool
149: IsValidMonochromeCursorFileData
150: (
151: const MONOCHROMECURSORFILEDATA_t *cursor
152: )
153: {
154: VALID_TEST( IsValidReadPtr( cursor, sizeof( cursor ) ) );
155: VALID_TEST( 0 == cursor->cfh.unknown );
156: VALID_TEST( 2 == cursor->cfh.type );
157: VALID_TEST( 1 == cursor->cfh.num );
158: VALID_TEST( 0 == cursor->cih.color );
159: VALID_TEST( 0 == cursor->cih.unknown );
160: VALID_TEST( sizeof( cursor->bih ) == cursor->bih.biSize );
161: VALID_TEST( 1 == cursor->bih.biPlanes );
162: VALID_TEST( 1 == cursor->bih.biBitCount );
163: VALID_TEST( 0 == cursor->bih.biCompression );
164:
165: const size_t size = CALC_MASK_SIZE( cursor->cih );
166: VALID_TEST( IsValidReadPtr( cursor, size ) );
167: VALID_TEST( cursor->maskXOR == ((BYTE *)cursor) + sizeof( *cursor ) );
168: VALID_TEST( cursor->maskAND == ((BYTE *)cursor) + sizeof( *cursor ) + size );
169: VALID_TEST( (cursor->maskXOR + size <= cursor->maskAND)
170: || (cursor->maskAND + size <= cursor->maskXOR) );
171:
172: return true;
173: }//IsValidMonochromeCursorFileData
174:
175:
176: //** end **
参照:
水無瀬の部屋 > sample > cur2cpp > loadcur.cpp |
---|
このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/cur2cpp/loadcur_cpp.shtml